// Geometric Tools, Inc.
// http://www.geometrictools.com
// Copyright (c) 1998-2006.  All Rights Reserved
//
// The Wild Magic Version 4 Restricted Libraries source code is supplied
// under the terms of the license agreement
//     http://www.geometrictools.com/License/Wm4RestrictedLicense.pdf
// and may not be copied or disclosed except in accordance with the terms
// of that agreement.

#ifndef WM4STRINGTREE_H
#define WM4STRINGTREE_H

#include "Wm4GraphicsLIB.h"
#include "Wm4Line3.h"
#include "Wm4Matrix2.h"
#include "Wm4Matrix3.h"
#include "Wm4Matrix4.h"
#include "Wm4Plane3.h"
#include "Wm4Quaternion.h"

namespace Wm4
{

class BoundingVolume;
class ColorRGB;
class ColorRGBA;
class Rtti;

class WM4_GRAPHICS_ITEM StringTree
{
public:
    // construction and destruction
    StringTree ();
    ~StringTree ();

    // strings
    int GetStringQuantity () const;
    void SetString (int i, char* acString);
    char* GetString (int i);
    void Append (char* acString);

    // children
    int GetChildQuantity () const;
    void SetChild (int i, StringTree* pkChild);
    StringTree* GetChild (int i);
    void Append (StringTree* pkChild);

    // streaming
    bool Save (const char* acFilename, int iTabSize = 4);

    static void FormatFloat (float fValue, size_t uiStringSize,
        char* acString);
    static void FormatDouble (double dValue, size_t uiStringSize,
        char* acString);

private:
    // streaming (recursive)
    void Save (FILE* pkOFile, int iLevel, int iTabSize);

    std::vector<char*> m_kStrings;
    std::vector<StringTree*> m_kChildren;
};

// string creation helpers (native types)
WM4_GRAPHICS_ITEM char* Format (const Rtti* pkRTTI, const char* acName);
WM4_GRAPHICS_ITEM char* Format (const char* acString);
WM4_GRAPHICS_ITEM char* Format (const char* acPrefix, bool);
WM4_GRAPHICS_ITEM char* Format (const char* acPrefix, char);
WM4_GRAPHICS_ITEM char* Format (const char* acPrefix, unsigned char);
WM4_GRAPHICS_ITEM char* Format (const char* acPrefix, short);
WM4_GRAPHICS_ITEM char* Format (const char* acPrefix, unsigned short);
WM4_GRAPHICS_ITEM char* Format (const char* acPrefix, int);
WM4_GRAPHICS_ITEM char* Format (const char* acPrefix, unsigned int);
WM4_GRAPHICS_ITEM char* Format (const char* acPrefix, long);
WM4_GRAPHICS_ITEM char* Format (const char* acPrefix, unsigned long);
WM4_GRAPHICS_ITEM char* Format (const char* acPrefix, float);
WM4_GRAPHICS_ITEM char* Format (const char* acPrefix, double);
WM4_GRAPHICS_ITEM char* Format (const char* acPrefix, void*);
WM4_GRAPHICS_ITEM char* Format (const char* acPrefix, const char*);

// string creation helpers (nonnative types)
WM4_GRAPHICS_ITEM char* Format (const char* acPrefix, const BoundingVolume*);
WM4_GRAPHICS_ITEM char* Format (const char* acPrefix, const ColorRGBA&);
WM4_GRAPHICS_ITEM char* Format (const char* acPrefix, const ColorRGB&);
WM4_GRAPHICS_ITEM char* Format (const char* acPrefix, const Line3f&);
WM4_GRAPHICS_ITEM char* Format (const char* acPrefix, const Matrix2f&);
WM4_GRAPHICS_ITEM char* Format (const char* acPrefix, const Matrix3f&);
WM4_GRAPHICS_ITEM char* Format (const char* acPrefix, const Matrix4f&);
WM4_GRAPHICS_ITEM char* Format (const char* acPrefix, const Plane3f&);
WM4_GRAPHICS_ITEM char* Format (const char* acPrefix, const Quaternionf&);
WM4_GRAPHICS_ITEM char* Format (const char* acPrefix, const Vector2f&);
WM4_GRAPHICS_ITEM char* Format (const char* acPrefix, const Vector3f&);
WM4_GRAPHICS_ITEM char* Format (const char* acPrefix, const Vector4f&);
WM4_GRAPHICS_ITEM char* Format (const char* acPrefix, const Line3d&);
WM4_GRAPHICS_ITEM char* Format (const char* acPrefix, const Matrix2d&);
WM4_GRAPHICS_ITEM char* Format (const char* acPrefix, const Matrix3d&);
WM4_GRAPHICS_ITEM char* Format (const char* acPrefix, const Matrix4d&);
WM4_GRAPHICS_ITEM char* Format (const char* acPrefix, const Plane3d&);
WM4_GRAPHICS_ITEM char* Format (const char* acPrefix, const Quaterniond&);
WM4_GRAPHICS_ITEM char* Format (const char* acPrefix, const Vector2d&);
WM4_GRAPHICS_ITEM char* Format (const char* acPrefix, const Vector3d&);
WM4_GRAPHICS_ITEM char* Format (const char* acPrefix, const Vector4d&);

template <class T>
StringTree* Format (const char* acTitle, int iQuantity, const T* atValue);

#include "Wm4StringTree.inl"

}

#endif
